--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_lxmf_utils_extended.py v4.5.0-rc.2 (1394a44a) Text, 7.98 KB
T8b949e# SPDX-License-Identifier: 0BSD
Tff7b72import T7ee787base64
Tff7b72import T7ee787json
Tff7b72from T7ee787datetime Tff7b72import Te6edf3UTCTb4b4b4, Te6edf3datetime
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMock
Tff7b72import T7ee787LXMF
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787lxmf_utils Tff7b72import Tb4b4b4(
Te6edf3compute_lxmf_conversation_unread_from_latest_rowTb4b4b4,
Te6edf3convert_db_lxmf_message_to_dictTb4b4b4,
Te6edf3convert_lxmf_message_to_dictTb4b4b4,
Te6edf3convert_lxmf_state_to_stringTb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_convert_lxmf_message_to_dict_basicTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3mock_msg Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3specTff7b72=Te6edf3LXMFTff7b72.Td2a8ffLXMessageTb4b4b4)
Te6edf3mock_msgTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffmsg_hashTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffsource_hash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffsrc_hashTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffdestination_hash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffdst_hashTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffincoming Tff7b72= Tff7b72True
Te6edf3mock_msgTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffSENT
Te6edf3mock_msgTff7b72.Td2a8ffprogress Tff7b72= T79c0ff0.5
Te6edf3mock_msgTff7b72.Td2a8ffmethod Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffDIRECT
Te6edf3mock_msgTff7b72.Td2a8ffdelivery_attempts Tff7b72= T79c0ff1
Te6edf3mock_msgTff7b72.Td2a8fftitle Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffTest TitleTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffcontent Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffTest ContentTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8fftimestamp Tff7b72= T79c0ff1234567890
Te6edf3mock_msgTff7b72.Td2a8ffrssi Tff7b72= Tff7b72-T79c0ff50
Te6edf3mock_msgTff7b72.Td2a8ffsnr Tff7b72= T79c0ff10
Te6edf3mock_msgTff7b72.Td2a8ffq Tff7b72= T79c0ff3
Te6edf3mock_msgTff7b72.Td2a8ffget_fieldsTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3result Tff7b72= Te6edf3convert_lxmf_message_to_dictTb4b4b4(Te6edf3mock_msgTb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff6d73675f68617368Ta5d6ff"
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffTest TitleTa5d6ff"
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffTest ContentTa5d6ff"
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffprogressTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff50.0
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffsentTa5d6ff"
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffdirectTa5d6ff"
Tff7b72def Td2a8fftest_convert_lxmf_message_to_dict_with_attachmentsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3mock_msg Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3specTff7b72=Te6edf3LXMFTff7b72.Td2a8ffLXMessageTb4b4b4)
Te6edf3mock_msgTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffhashTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffsource_hash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffsrcTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffdestination_hash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffdstTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffincoming Tff7b72= Tff7b72False
Te6edf3mock_msgTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffDELIVERED
Te6edf3mock_msgTff7b72.Td2a8ffprogress Tff7b72= T79c0ff1.0
Te6edf3mock_msgTff7b72.Td2a8ffmethod Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffPROPAGATED
Te6edf3mock_msgTff7b72.Td2a8ffdelivery_attempts Tff7b72= T79c0ff1
Te6edf3mock_msgTff7b72.Td2a8fftitle Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffcontent Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3mock_msgTff7b72.Td2a8fftimestamp Tff7b72= T79c0ff1234567890
Te6edf3mock_msgTff7b72.Td2a8ffrssi Tff7b72= Tff7b72None
Te6edf3mock_msgTff7b72.Td2a8ffsnr Tff7b72= Tff7b72None
Te6edf3mock_msgTff7b72.Td2a8ffq Tff7b72= Tff7b72None
T8b949e# Setup fields
Te6edf3fields Tff7b72= Tb4b4b4{
Te6edf3LXMFTff7b72.Td2a8ffFIELD_FILE_ATTACHMENTSTb4b4b4: Tb4b4b4[Tb4b4b4(Ta5d6ff"Ta5d6fffile1.txtTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffcontent1Ta5d6ff"Tb4b4b4)Tb4b4b4]Tb4b4b4,
Te6edf3LXMFTff7b72.Td2a8ffFIELD_IMAGETb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffpngTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffimage_dataTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3LXMFTff7b72.Td2a8ffFIELD_AUDIOTb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ffvoiceTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffaudio_dataTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Te6edf3mock_msgTff7b72.Td2a8ffget_fieldsTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3fields
Te6edf3result Tff7b72= Te6edf3convert_lxmf_message_to_dictTb4b4b4(Te6edf3mock_msgTb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fffile_attachmentsTa5d6ff"Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fffile_nameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fffile1.txtTa5d6ff"
Tff7b72assert Tb4b4b4(
Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fffile_attachmentsTa5d6ff"Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fffile_bytesTa5d6ff"Tb4b4b4]
Tff7b72== Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffcontent1Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)
Tb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffimageTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffimage_typeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffpngTa5d6ff"
Tff7b72assert Tb4b4b4(
Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffimageTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffimage_bytesTa5d6ff"Tb4b4b4]
Tff7b72== Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffimage_dataTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)
Tb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffaudioTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffaudio_modeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffvoiceTa5d6ff"
Tff7b72assert Tb4b4b4(
Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffaudioTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffaudio_bytesTa5d6ff"Tb4b4b4]
Tff7b72== Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffaudio_dataTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)
Tb4b4b4)
Tff7b72def Td2a8fftest_convert_lxmf_state_to_stringTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3mock_msg Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3states Tff7b72= Tb4b4b4{
Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffGENERATINGTb4b4b4: Ta5d6ff"Ta5d6ffgeneratingTa5d6ff"Tb4b4b4,
Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffOUTBOUNDTb4b4b4: Ta5d6ff"Ta5d6ffoutboundTa5d6ff"Tb4b4b4,
Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffSENDINGTb4b4b4: Ta5d6ff"Ta5d6ffsendingTa5d6ff"Tb4b4b4,
Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffSENTTb4b4b4: Ta5d6ff"Ta5d6ffsentTa5d6ff"Tb4b4b4,
Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffDELIVEREDTb4b4b4: Ta5d6ff"Ta5d6ffdeliveredTa5d6ff"Tb4b4b4,
Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffREJECTEDTb4b4b4: Ta5d6ff"Ta5d6ffrejectedTa5d6ff"Tb4b4b4,
Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffCANCELLEDTb4b4b4: Ta5d6ff"Ta5d6ffcancelledTa5d6ff"Tb4b4b4,
Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffFAILEDTb4b4b4: Ta5d6ff"Ta5d6fffailedTa5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72for Te6edf3stateTb4b4b4, Te6edf3expected Tff7b72in Te6edf3statesTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3mock_msgTff7b72.Td2a8ffstate Tff7b72= Te6edf3state
Tff7b72assert Te6edf3convert_lxmf_state_to_stringTb4b4b4(Te6edf3mock_msgTb4b4b4) Tff7b72== Te6edf3expected
Tff7b72def Td2a8fftest_convert_db_lxmf_message_to_dictTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3db_msg Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffhash_hexTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsource_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffsrc_hexTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdst_hexTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffis_incomingTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdeliveredTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffprogressTa5d6ff"Tb4b4b4: T79c0ff100.0Tb4b4b4,
Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdirectTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdelivery_attemptsTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffnext_delivery_attempt_atTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTitleTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffContentTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4: Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffimageTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffimage_typeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffjpgTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffimage_bytesTa5d6ff"Tb4b4b4: Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffimgTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffaudioTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffaudio_modeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffoggTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffaudio_bytesTa5d6ff"Tb4b4b4: Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffaudioTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6fffile_attachmentsTa5d6ff"Tb4b4b4: Tb4b4b4[
Tb4b4b4{
Ta5d6ff"Ta5d6fffile_nameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fff.txtTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffile_bytesTa5d6ff"Tb4b4b4: Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: T79c0ff1234567890Tb4b4b4,
Ta5d6ff"Ta5d6ffrssiTa5d6ff"Tb4b4b4: Tff7b72-T79c0ff60Tb4b4b4,
Ta5d6ff"Ta5d6ffsnrTa5d6ff"Tb4b4b4: T79c0ff5Tb4b4b4,
Ta5d6ff"Ta5d6ffqualityTa5d6ff"Tb4b4b4: T79c0ff2Tb4b4b4,
Ta5d6ff"Ta5d6ffis_spamTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffcreated_atTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff2023-01-01 12:00:00Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffupdated_atTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff2023-01-01 12:05:00Ta5d6ff"Tb4b4b4,
Tb4b4b4}
T8b949e# Test with attachments
Te6edf3result Tff7b72= Te6edf3convert_db_lxmf_message_to_dictTb4b4b4(Te6edf3db_msgTb4b4b4, Te6edf3include_attachmentsTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffimageTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffimage_bytesTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffcreated_atTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ffZTa5d6ff"Tb4b4b4)
T8b949e# Test without attachments
Te6edf3result_no_att Tff7b72= Te6edf3convert_db_lxmf_message_to_dictTb4b4b4(Te6edf3db_msgTb4b4b4, Te6edf3include_attachmentsTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72assert Te6edf3result_no_attTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffimageTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffimage_bytesTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72None
Tff7b72assert Te6edf3result_no_attTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffimageTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffimage_sizeTa5d6ff"Tb4b4b4] Tff7b72== Tffa657lenTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffimgTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3result_no_attTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffaudioTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffaudio_sizeTa5d6ff"Tb4b4b4] Tff7b72== Tffa657lenTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffaudioTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3result_no_attTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fffile_attachmentsTa5d6ff"Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fffile_sizeTa5d6ff"Tb4b4b4] Tff7b72== Tffa657lenTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_convert_lxmf_message_to_dict_with_replyTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3mock_msg Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3specTff7b72=Te6edf3LXMFTff7b72.Td2a8ffLXMessageTb4b4b4)
Te6edf3mock_msgTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffmsg_hashTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffsource_hash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffsrc_hashTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffdestination_hash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffdst_hashTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffincoming Tff7b72= Tff7b72True
Te6edf3mock_msgTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffSENT
Te6edf3mock_msgTff7b72.Td2a8ffprogress Tff7b72= T79c0ff1.0
Te6edf3mock_msgTff7b72.Td2a8ffmethod Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffDIRECT
Te6edf3mock_msgTff7b72.Td2a8ffdelivery_attempts Tff7b72= T79c0ff1
Te6edf3mock_msgTff7b72.Td2a8fftitle Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffcontent Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffReply textTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8fftimestamp Tff7b72= T79c0ff1234567890
Te6edf3mock_msgTff7b72.Td2a8ffrssi Tff7b72= Tff7b72None
Te6edf3mock_msgTff7b72.Td2a8ffsnr Tff7b72= Tff7b72None
Te6edf3mock_msgTff7b72.Td2a8ffq Tff7b72= Tff7b72None
T8b949e# Reply to hash
Te6edf3reply_hash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6fforiginal_msg_hashTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffget_fieldsTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{T79c0ff0x30Tb4b4b4: Te6edf3reply_hashTb4b4b4}
Te6edf3result Tff7b72= Te6edf3convert_lxmf_message_to_dictTb4b4b4(Te6edf3mock_msgTb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffreply_toTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3reply_hashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_convert_db_lxmf_message_to_dict_with_replyTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3db_msg Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffhash_hexTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsource_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffsrc_hexTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdst_hexTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffis_incomingTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdeliveredTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffprogressTa5d6ff"Tb4b4b4: T79c0ff100.0Tb4b4b4,
Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdirectTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdelivery_attemptsTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffnext_delivery_attempt_atTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTitleTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffContentTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4: Ta5d6ff"Tffd700{}Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: T79c0ff1234567890Tb4b4b4,
Ta5d6ff"Ta5d6ffrssiTa5d6ff"Tb4b4b4: Tff7b72-T79c0ff60Tb4b4b4,
Ta5d6ff"Ta5d6ffsnrTa5d6ff"Tb4b4b4: T79c0ff5Tb4b4b4,
Ta5d6ff"Ta5d6ffqualityTa5d6ff"Tb4b4b4: T79c0ff2Tb4b4b4,
Ta5d6ff"Ta5d6ffis_spamTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffreply_to_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fforiginal_hash_hexTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcreated_atTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff2023-01-01 12:00:00Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffupdated_atTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff2023-01-01 12:05:00Ta5d6ff"Tb4b4b4,
Tb4b4b4}
Te6edf3result Tff7b72= Te6edf3convert_db_lxmf_message_to_dictTb4b4b4(Te6edf3db_msgTb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffreply_to_hashTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fforiginal_hash_hexTa5d6ff"
Tff7b72def Td2a8fftest_compute_unread_outgoing_latest_never_unread_even_without_read_cursorTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3row Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffis_incomingTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6fflast_read_atTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: T79c0ff1_700_000_000.0Tb4b4b4,
Tb4b4b4}
Tff7b72assert Te6edf3compute_lxmf_conversation_unread_from_latest_rowTb4b4b4(Te6edf3rowTb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_compute_unread_incoming_no_read_cursor_is_unreadTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3row Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffis_incomingTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6fflast_read_atTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: T79c0ff1_700_000_000.0Tb4b4b4,
Tb4b4b4}
Tff7b72assert Te6edf3compute_lxmf_conversation_unread_from_latest_rowTb4b4b4(Te6edf3rowTb4b4b4) Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_compute_unread_incoming_not_unread_when_read_cursor_covers_messageTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3ts Tff7b72= T79c0ff1_700_000_000.0
Te6edf3read_after_msg Tff7b72= Te6edf3datetimeTff7b72.Td2a8fffromtimestampTb4b4b4(Te6edf3ts Tff7b72+ T79c0ff60Tb4b4b4, Te6edf3UTCTb4b4b4)Tff7b72.Td2a8ffisoformatTb4b4b4(Tb4b4b4)
Te6edf3row Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffis_incomingTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6fflast_read_atTa5d6ff"Tb4b4b4: Te6edf3read_after_msgTb4b4b4,
Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: Te6edf3tsTb4b4b4,
Tb4b4b4}
Tff7b72assert Te6edf3compute_lxmf_conversation_unread_from_latest_rowTb4b4b4(Te6edf3rowTb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_compute_unread_incoming_newer_than_read_cursor_unreadTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3ts Tff7b72= T79c0ff1_700_000_000.0
Te6edf3read Tff7b72= Te6edf3datetimeTff7b72.Td2a8fffromtimestampTb4b4b4(Te6edf3ts Tff7b72- T79c0ff120Tb4b4b4, Te6edf3UTCTb4b4b4)Tff7b72.Td2a8ffisoformatTb4b4b4(Tb4b4b4)
Te6edf3row Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffis_incomingTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6fflast_read_atTa5d6ff"Tb4b4b4: Te6edf3readTb4b4b4,
Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: Te6edf3tsTb4b4b4,
Tb4b4b4}
Tff7b72assert Te6edf3compute_lxmf_conversation_unread_from_latest_rowTb4b4b4(Te6edf3rowTb4b4b4) Tff7b72is Tff7b72True
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────